import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

function replaceStringPlugin(options = { find: '', replace: '' }) {
  const { find, replace } = options

  return {
    name: 'replace-string',
    // 在生成 chunk 时进行替换
    renderChunk(code, chunk) {
      return find ? code.replace(new RegExp(find, 'g'), replace) : code
    },
  }
}

export default defineConfig(({ command, mode }) => {
  const isProduction = command === 'build';
  
  return {
    plugins: [
      react(),
      replaceStringPlugin({
        find: 'api.cloud\\.copilotkit\\.ai',
        replace: 'mamisai.com/ruoyi/v1',
      }),
    ],
    // 开发服务器配置
    server: {
      port: 3456,
      open: true,
    },
    // 根据模式配置不同的构建选项
    ...(isProduction ? {
      build: {
        lib: {
          entry: 'src/index.ts',
          name: 'MamisCopilot',
          fileName: (format) => `mamis-copilot.${format}.js`,
          formats: ['umd'] // 主要使用UMD格式，便于脚本标签引入
        },
        rollupOptions: {
          external: [
            // 不外部化任何依赖，打包成完整的独立脚本
            // 但需要外部化 Node.js 内置模块以避免浏览器兼容性警告
            'stream',
            'http',
            'https',
            'url',
            'zlib',
            'util',
            'buffer'
          ],
          output: {
            // UMD格式配置
            globals: {
              'stream': 'Stream',
              'http': 'Http',
              'https': 'Https',
              'url': 'URL',
              'zlib': 'Zlib',
              'util': 'Util',
              'buffer': 'Buffer'
            },
            // 确保所有依赖都打包进来
            inlineDynamicImports: true,
            // 禁用命名导出和默认导出混合使用的警告
            exports: "named"
          }
        },
        // 不分割CSS，全部内联到JS中
        cssCodeSplit: false,
        // 生产环境压缩
        minify: 'terser',
        terserOptions: {
          compress: {
            drop_console: true,
            drop_debugger: true
          },
          mangle: {
            // 保留特定的全局变量名
            reserved: ['MamisCopilot']
          }
        },
        // 确保生成单一文件
        assetsInlineLimit: 100000000, // 100MB，确保所有资源内联
      }
    } : {}),
    // 通用配置
    resolve: {
      alias: {
        '@': './src',
        '@copilot': './src/copilot',
        '@isolation': './src/isolation'
      }
    },
    // 环境变量和 Node.js polyfills 配置
    define: {
      // 环境变量定义
      __COPILOT_VERSION__: JSON.stringify('1.0.0'),
      __BUILD_TIME__: JSON.stringify(new Date().toISOString()),
      'process.env.NODE_ENV': JSON.stringify(isProduction ? 'production' : 'development'),
      // 为 Node.js 内置模块提供浏览器兼容的空实现
      'process.version': '""',
      'process.platform': '"browser"',
      'Buffer': 'undefined',
      'global': 'globalThis'
    },
    // 优化配置
    optimizeDeps: {
      include: [
        '@copilotkit/react-core',
        '@copilotkit/react-ui',
        'react',
        'react-dom'
      ]
    }
  };
});